SQL - Uma Web App VB NET com MS SQL Server

Auxiliares - Módulo MSSQLSRV


Imports System.Data.SqlClient
Imports System.Web.Configuration

'System.Web.HttpContext.Current.Response.End()
'string str = "../Erro.aspx?msg='" + ex.Message + "'"
'System.Web.HttpContext.Current.Response.Redirect(str,true)
'return null

Module mdlMSSQLSRV

    'notas sobre os strings de conexão com o banco de dados
    'eles podem ser definidos em diversos locais por motivos de segurança
    '
    'Se for inserir no web config seve ser colocado logo após </appSettings>
    'name é o nome da conexao
    'connectionString é o string de conexão
    '<connectionStrings>
    '<add name = "ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
    '<add name = "SQLPROD" connectionString="Server=Servidor; Database=BaseDados; UID=Usuario;PWD=Senha" providerName="System.Data.SqlClient"/>
    '<add name = "SQLTESTES" connectionString="Server=Servidor; Database=BaseDados; UID=Usuario;PWD=Senha" providerName="System.Data.SqlClient"/>
    '<add name = "SQLCON3" connectionString="Server=Servidor; Database=BaseDados; UID=Usuario;PWD=Senha" providerName="System.Data.SqlClient"/>
    '<add name = "SQLCON4" connectionString="Server=Servidor; Database=BaseDados; UID=Usuario;PWD=Senha" providerName="System.Data.SqlClient"/>
    '<add name = "ExcelCon" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|teste.xls;Extended Properties=Excel 12.0"/>
    '</connectionStrings>

    'para ler o string de conexão da session
    'Public cnstr As String = System.Web.HttpContext.Current.Session("CONEXAO").ToString()

    Public cnstr As String = "" 'string de conexão com o banco de dados
    Public cncn As New SqlConnection 'conexão com o banco de dados
    Public Erro As String = "" 'troca de mensagens de erro

    ''' <summary>
    ''' Definindo o string de conexão com o banco de dados que dependente da url de acesso do site
    ''' </summary>
    Public Function ObtemStrConexao() As String
        Dim cnstr As String = ""

        'p=produção
        Dim srvp As String = ""
        Dim bdp As String = ""
        Dim usup As String = ""
        Dim senhap As String = ""

        't=teste
        Dim srvt As String = "srvxeon1\MSSQLSDRV"
        Dim bdt As String = "dbagenda"
        Dim usut As String = "usucomum"
        Dim senhat As String = "Escola@1"

        'definindo o acesso ao bd pela url do site - salvando na session
        Dim strurl As String = My.Request.Url.AbsoluteUri
        strurl = strurl.ToUpper()

            If ((strurl.IndexOf("LOCALHOST") <> 0) Or (strurl.IndexOf("TEST") <> 0)) Then
            'Servidores Local ou de teste
            System.Web.HttpContext.Current.Session.Add("SERVIDOR", "TESTES")

            'lendo do web config
            'cnstr = WebConfigurationManager.ConnectionStrings("SQLTESTES").ConnectionString

            'definindo o str conexão aqui mesmo
            'cnstr = "Server=" + srvt + ";Database=" + bdt + ";User ID=" + usut + ";Password=" + senhat + "/>"
            'cnstr = "Data Source=" + srvt + ";Initial Catalog=" + bdt + ";Integrated Security=true;"
            cnstr = "Data Source = " + srvt + ";Initial Catalog=" + bdt + "; User ID=" + usut + "; Password=" + senhat
            System.Web.HttpContext.Current.Session.Add("CONEXAO", cnstr)
        Else
            'Servidor de produção
            System.Web.HttpContext.Current.Session.Add("SERVIDOR", "PRODUCAO")

            'lendo do web config
            'cnstr = WebConfigurationManager.ConnectionStrings("SQLPROD").ConnectionString

            'definindo o str conexão aqui mesmo

            System.Web.HttpContext.Current.Session.Add("CONEXAO", cnstr)
        End If
        Return cnstr
    End Function

    ''' <summary>
    ''' conecta com o banco de dados - define str conexão
    ''' </summary>
    Public Sub MS_SQL_SRV_CON()
        Erro = ""
        Try
            If (cncn.State = ConnectionState.Closed) Then
                'cnstr = Session("CONEXAO").ToString()
                cnstr = ObtemStrConexao()
                cncn.ConnectionString = cnstr
                cncn.Open()
                Return
            End If
        Catch ex As Exception
            Erro = ex.Message
        End Try

    End Sub

    ''' <summary>
    '''faz a pesquisa e retorna um DataSet
    ''' </summary>
    Public Function MS_SQL_SRV_DS(query As String) As DataSet
        Erro = ""
        Try
            MS_SQL_SRV_CON()
            Dim da As New SqlDataAdapter(query, cncn)
            Dim ds As New DataSet
            da.Fill(ds)
            cncn.Close()
            Return ds

        Catch ex As SqlException
            Erro = ex.Message
            Return Nothing
            'Throw ex
        End Try

    End Function


    ''' <summary>
    '''executa um sql que não retorna nada
    ''' </summary>
    Public Sub MS_SQL_SRV_EX(query As String)
        Erro = ""
        Try
            MS_SQL_SRV_CON()
            Dim cmd = New SqlCommand(query, cncn)
            cmd.CommandTimeout = 20000
            cmd.ExecuteNonQuery()
            cncn.Close()

        Catch ex As Exception
            Erro = ex.Message
            'Throw ex
        End Try
    End Sub

    ''' <summary>
    '''executa um sql que retorna um inteiro
    ''' </summary>
    Public Function MS_SQL_SRV_INT(query As String) As Integer
        Erro = ""
        Try
            MS_SQL_SRV_CON()
            Dim cmd = New SqlCommand(query, cncn)
            cmd.CommandText = query
            Return cmd.ExecuteScalar()
        Catch ex As Exception
            Erro = ex.Message
            Return Nothing 'erro
            'Throw ex
        End Try
    End Function

    ''' <summary>
    ''' executa um sql que retorna um String
    ''' </summary>
    ''' <param name="query"></param>
    ''' <returns></returns>
    Public Function MS_SQL_SRV_STR(query As String) As String
        Erro = ""
        Try
            MS_SQL_SRV_CON()
            Dim cmd = New SqlCommand(query, cncn)
            cmd.CommandText = query
            Return cmd.ExecuteScalar()
        Catch ex As Exception
            Erro = ex.Message
            Return Nothing
            'Throw ex
        End Try
    End Function

    ''' <summary>
    ''' executa um sql que retorna um single(sql)
    ''' </summary>
    ''' <param name="query"></param>
    ''' <returns></returns>
    Public Function MS_SQL_SRV_Single(query As String)
        Erro = ""
        Try
            MS_SQL_SRV_CON()
            Dim cmd = New SqlCommand(query, cncn)
            cmd.CommandText = query
            Return cmd.ExecuteScalar()
        Catch ex As Exception
            Erro = ex.Message
            Return Nothing 'erro
            'Throw ex
        End Try
    End Function

    ''' <summary>
    ''' Executa uma procedure e retorna um dataset
    ''' Parametros = "P1,P2,P3,P4..."
    ''' </summary>
    Public Function MS_SQL_SQL_Proc(Procedure As String, Parametros As String) As DataSet
        Erro = ""
        Try
            Dim SQL As String = Procedure + " " + Parametros
            Dim cmd As New SqlCommand(SQL, cncn)
            Dim da As New SqlDataAdapter(cmd)
            Dim ds As New DataSet()
            da.Fill(ds)
            Return ds
        Catch ex As Exception
            Erro = ex.Message
            Return Nothing
            'Throw ex
        End Try
    End Function


End Module

Auxiliares - Módulo Utilitarios

Module mdlUtilitarios


    ''' <summary>
    ''' Retorna true se o texto apresenta riscos de sql injection
    ''' </summary>
    ''' <param name="dado"></param>
    ''' <returns></returns>
    Public Function VerificarSQLInjection(dado As String) As Boolean
        Dim a As String

        a = (dado).ToUpper

        If InStr(a, "SELECT ") <> 0 Then Return True
        If InStr(a, "INSERT ") <> 0 Then Return True
        If InStr(a, "DELETE ") <> 0 Then Return True
        If InStr(a, "UPDATE ") <> 0 Then Return True
        If InStr(a, "DROP ") <> 0 Then Return True
        If InStr(a, "TRUNCATE ") <> 0 Then Return True
        If (InStr(a, "ALTER ") <> 0) And (InStr(a, "WALTER ") = 0) Then Return True
        If InStr(a, "LIKE ") <> 0 Then Return True

        If InStr(a, "%") <> 0 Then Return True
        If InStr(a, "_") <> 0 Then Return True

        Return False
    End Function

    ''' <summary>
    ''' insere um elemento na cláusula where do sql
    ''' </summary>
    ''' <param name="sql"> é o sql a ser alterado</param>
    ''' <param name="cond"> condição a ser acrescentada (nome=x, tel=y</param>
    ''' <returns></returns>
    Public Function insWhere(sql As String, cond As String)
        Dim a As String

        a = sql

        If InStr(UCase(sql), "WHERE") <> 0 Then
            a = a + " and " + cond
        Else
            a = a + " where " + cond
        End If

        Return a
    End Function

    ''' <summary>
    ''' foi feita uma pesquisa e apenas um item foi encontrado
    ''' </summary>
    Public Sub ExibirItem(sql As String)
        Dim ds As New DataSet

        ds = MS_SQL_SRV_DS(sql)

    End Sub

End Module

Pagina Default.aspx


<%@ Page Title="Home Page" Language="VB" AutoEventWireup="true" CodeBehind="Default.aspx.vb" Inherits="_328_WebAppMaisSQLServer._Default" %>

<!DOCTYPE html>
<html lang="pt">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <link rel="stylesheet" type="text/css" href="Content/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="Content/Site.css">
    <title><%: Page.Title %> - Meu web app ASP VB.NET com MS SQL SRV</title>
</head>
<body>
    <form runat="server">
        <div class="container body-content">

            <div class="jumbotron">
                <h1>Bem vindo a sua agenda pessoal</h1>
            </div>

            <div class="row">

                <div class="col-md-3">
                    <h2>Consultar</h2>
                    <p>Esta funcionalidade permite consultar suas anotações na sua agenda.</p>
                    <p>
                        <a class="btn btn-default" href="Selecionar.aspx">Pesquisas »</a>
                    </p>
                </div>

                <div class="col-md-3">
                    <h2>Inserir</h2>
                    <p>Esta funcionalidade permite Inserir anotações da sua agenda</p>
                    <p>
                        <a class="btn btn-default" href="Inserir.aspx">Inserir »</a>
                    </p>
                </div>

                <div class="col-md-3">
                    <h2>Retirar</h2>
                    <p>Esta funcionalidade permite retirar anotações da sua agenda</p>
                    <p>
                        <a class="btn btn-default" href="retirar.aspx">Retirar »</a>
                    </p>
                </div>

                <div class="col-md-3">
                    <h2>Alterar</h2>
                    <p>Esta funcionalidade permite que você altere os dados da sua agenda</p>
                    <p>
                        <a class="btn btn-default" href="#">Alterar »</a>
                    </p>
                </div>
            </div>

        </div>

    </form>
</body>
</html>

Página de pesquisa - Selecionar.aspx


<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Selecionar.aspx.vb" Inherits="_328_WebAppMaisSQLServer.Selecionar" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <link rel="stylesheet" type="text/css" href="Content/bootstrap.min.css" />
    <link rel="stylesheet" type="text/css" href="Content/Site.css" />
    <title><%: Page.Title %> - Pesquisa e Seleção</title>

</head>


<body>
    <form id="form1" runat="server">
        
        <div class="jumbotron">
            <h3 style="text-align:center;">Agenda pessoal - Seleção de item - Pesquisa e Seleção</h3>
        </div>

        <div>
            <asp:Label ID="lblmsg" runat="server" Text=""></asp:Label></div>
        <div>
            <div style="padding-left:30%;">
                <table>
                    <tr>
                        <td>Nome : </td>
                        <td><asp:TextBox ID="txtNome" runat="server" Width="300px"></asp:TextBox></td>
                    </tr>
                    <tr><td> </td></tr>
                    <tr>
                        <td>Email : </td>
                        <td><asp:TextBox ID="txtEmail" runat="server" Width="300px"></asp:TextBox></td>
                    </tr>
                    <tr><td> </td></tr>
                    <tr>
                        <td>Telefone : </td>
                        <td><asp:TextBox ID="txtTelefone" runat="server" Width="300px"></asp:TextBox></td>
                    </tr>

                    <tr><td> </td></tr>

                    <tr>
                        <td><asp:Button ID="btnCancelar" runat="server" Text="Cancelar" /></td>
                        <td style="text-align:right;"><asp:Button ID="btnProsseguir" runat="server" Text="Prosseguir" /></td>
                    </tr>

                </table>
            </div>
        </div>
    </form>
</body>
</html>

Página de pesquisa - Selecionar.aspx.vb


Public Class Selecionar
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    End Sub

    Protected Sub btnCancelar_Click(sender As Object, e As EventArgs) Handles btnCancelar.Click
        Response.Redirect("Default.aspx")
    End Sub

    Protected Sub btnProsseguir_Click(sender As Object, e As EventArgs) Handles btnProsseguir.Click
        Dim sql As String
        Dim a As Integer

        'corrigir : Parece que ao clicar em Retornar esta dando um postback no form o que
        'faria inserir o mesmo usuário 2 vezes

        'checando se os campos de pesquisa são válidos
        If txtNome.Text = "" And txtEmail.Text = "" And txtTelefone.Text = "" Then
            lblmsg.Text = "Os campos Nome, Email e Telefone estão em branco. Pesquisa cancelada."
            lblmsg.ForeColor = Drawing.Color.Red
            Exit Sub
        End If

        'trocando o caractere ' por ´
        txtNome.Text = Replace(txtNome.Text, "'", "´")
        txtEmail.Text = Replace(txtEmail.Text, "'", "´")
        txtTelefone.Text = Replace(txtTelefone.Text, "'", "´")

        'verificando sql injection
        If VerificarSQLInjection(txtNome.Text) Then
            lblmsg.Text = "Nome Inválido. Pesquisa cancelada."
            lblmsg.ForeColor = Drawing.Color.Red
            txtNome.Focus()
            Exit Sub
        End If

        If VerificarSQLInjection(txtEmail.Text) Then
            lblmsg.Text = "Email Inválido. Pesquisa cancelada."
            lblmsg.ForeColor = Drawing.Color.Red
            txtEmail.Focus()
            Exit Sub
        End If

        If VerificarSQLInjection(txtTelefone.Text) Then
            lblmsg.Text = "Telefone Inválido. Pesquisa cancelada."
            lblmsg.ForeColor = Drawing.Color.Red
            txtTelefone.Focus()
            Exit Sub
        End If

        'tudo certo - podemos fazer a pesquisa
        sql = "select count(*) from tblAgenda "

        If txtNome.Text <> "" Then
            sql = insWhere(sql, "Nome='" + txtNome.Text + "'")
        End If

        If txtEmail.Text <> "" Then
            sql = insWhere(sql, "Email='" + txtEmail.Text + "'")
        End If

        If txtTelefone.Text <> "" Then
            sql = insWhere(sql, "Telefone='" + txtTelefone.Text + "'")
        End If

        'executando o sql - verificando se vem só um registro ou muitos
        a = MS_SQL_SRV_INT(sql)

        If Erro <> "" Then
            lblmsg.Text = Erro
            Exit Sub
        End If

        Select Case a
            Case 0
                lblmsg.Text = "Não foi encontrado nenhum registro com os critérios apresentados."
                lblmsg.ForeColor = Drawing.Color.Green
                Exit Sub
            Case 1
                sql = Replace(sql, "select count(*)", "select * ")
                ExibirItem(sql)
            Case 2
                'AdicionarASelecaoDeItens
        End Select

    End Sub
End Class

Página Inserir.aspx


<%@ Page Language="vb" AutoEventWireup="true" CodeBehind="Inserir.aspx.vb" Inherits="_328_WebAppMaisSQLServer.Inserir" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <link rel="stylesheet" type="text/css" href="Content/bootstrap.min.css" />
    <link rel="stylesheet" type="text/css" href="Content/Site.css" />
    <title><%: Page.Title %> - Inserção de nova Anotação</title>

</head>


<body>
    <form id="frmInserirNovoItem" runat="server" method="post">
        
        <div class="jumbotron">
            <h3 style="text-align:center;">Agenda pessoal - Inserção de um novo item</h3>
        </div>

        <div>
            <asp:Label ID="lblmsg" runat="server" Text=""></asp:Label>
        </div>

        <div style="padding-left:30%;">
            <table>
                <tr>
                    <td>Nome : </td>
                    <td><input type="text" name="txtNome" id="txtNome" style="width:300px" /></td>
                </tr>

                <tr><td> </td></tr>

                <tr>
                    <td>Email : </td>
                    <td><input type="text" name="txtEmail" id="txtEmail" style="width:300px" /></td>
                </tr>

                <tr><td> </td></tr>

                <tr>
                    <td>Telefone : </td>
                    <td><input type="text" name="txtTelefone" id="txtTelefone" style="width:300px" /></td>
                </tr>

                <tr><td> </td></tr>

                <tr>
                    <td><asp:Button id="btnCancelar" runat="server" Text="Cancelar" /></td>
                    <td style="text-align:right;">
                        <asp:Button ID="btnInserir" runat="server" Text="Inserir" />
                    </td>
                </tr>

            </table>
        </div>

    </form>
</body>
</html>

Página Inserir.aspx.vb


Public Class Inserir
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim sql As String

        If IsPostBack Then 'O PostBack é uma ação que ocorre em uma página enviando dados para o servidor

            Dim nome As String = Request.Form("txtNome")
            Dim Email As String = Request.Form("txtEmail")
            Dim Telefone As String = Request.Form("txtTelefone")

            'trocando o caractere ' por ´
            nome = Replace(nome, "'", "´")

            'verificando sql injection
            If VerificarSQLInjection(nome) Then
                lblmsg.Text = "Nome Inválido."
                lblmsg.ForeColor = Drawing.Color.Red
                Exit Sub
            End If

            If VerificarSQLInjection(Email) Then
                lblmsg.Text = "Email Inválido."
                lblmsg.ForeColor = Drawing.Color.Red
                Exit Sub
            End If

            If VerificarSQLInjection(Telefone) Then
                lblmsg.Text = "Telefone Inválido."
                lblmsg.ForeColor = Drawing.Color.Red
                Exit Sub
            End If

            sql = "insert into tblAgenda(Nome, Email, Telefone) Values ("

            If nome <> "" Then
                sql = sql + "'" + nome + "',"
            Else
                sql = sql + "null,"
            End If

            If Email <> "" Then
                sql = sql + "'" + Email + "',"
            Else
                sql = sql + "null,"
            End If

            If Telefone <> "" Then
                sql = sql + "'" + Telefone + "')"
            Else
                sql = sql + "null)"
            End If

            'inserindo no banco de dados
            MS_SQL_SRV_EX(sql)

            If Erro <> "" Then
                lblmsg.Text = Erro
                lblmsg.ForeColor = System.Drawing.Color.Red
            Else
                lblmsg.Text = "Anotação Inserida"
                lblmsg.ForeColor = System.Drawing.Color.Green
            End If

        End If

    End Sub

End Class

Falta terminar esta app